package jp.co.nes.awssupport.common.utility;

import java.nio.ByteBuffer;
import java.nio.charset.Charset;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.kms.AWSKMS;
import com.amazonaws.services.kms.AWSKMSClientBuilder;
import com.amazonaws.services.kms.model.DecryptRequest;
import com.amazonaws.services.kms.model.EncryptRequest;
import com.amazonaws.util.Base64;

/**
 * KMSヘルパーです。<br>
 * KMSに関する機能を提供します。
 */
public class AwsKmsHelper extends AwsHelperBase {

    /** クライアント */
    private AWSKMS client;

    /**
     * デフォルトコンストラクタです。
     */
    public AwsKmsHelper() {
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.utility.AwsHelperBase#init(com.amazonaws.regions.Regions, com.amazonaws.auth.AWSCredentials, com.amazonaws.ClientConfiguration)
     */
    @Override
    protected void init(Regions regions, AWSCredentials credentials, ClientConfiguration config) {
        boolean isLocalTest = Boolean.valueOf(PropertiesUtil.getProperty("LocalTest", "false"));
        if (!isLocalTest) {
            if (credentials == null) {
                if (config == null) {
                    client = AWSKMSClientBuilder.standard()
                            .withRegion(regions)
                            .build();
                } else {
                    client = AWSKMSClientBuilder.standard()
                            .withRegion(regions)
                            .withClientConfiguration(config)
                            .build();
                }
            } else {
                if (config == null) {
                    client = AWSKMSClientBuilder.standard()
                            .withRegion(regions)
                            .withCredentials(new AWSStaticCredentialsProvider(credentials))
                            .withClientConfiguration(new ClientConfiguration())
                            .build();
                } else {
                    client = AWSKMSClientBuilder.standard()
                            .withRegion(regions)
                            .withCredentials(new AWSStaticCredentialsProvider(credentials))
                            .withClientConfiguration(config)
                            .build();
                }
            }
        }
    }

    /**
     * 指定された文字列を指定された鍵で暗号化した後、Base64エンコーディングし、返却します。
     *
     * @param keyArn 鍵のarn
     * @param value 暗号化する文字列
     * @return 暗号化した後、Base64エンコーディングした結果
     */
    public String encrypt(String keyArn, String value) {
        EncryptRequest request = new EncryptRequest();
        request.setKeyId(keyArn);
        request.setPlaintext(ByteBuffer.wrap(value.getBytes()));
        ByteBuffer result = client.encrypt(request).getCiphertextBlob();
        return Base64.encodeAsString(result.array());
    }

    /**
     * 暗号化した後、Base64エンコーディングした文字列を複合します。
     *
     * @param value 暗号化した後、Base64エンコーディングした文字列
     * @return 複合した結果
     */
    public String decrypt(String value) {
        DecryptRequest request = new DecryptRequest();
        request.setCiphertextBlob(ByteBuffer.wrap(Base64.decode(value)));
        ByteBuffer result = client.decrypt(request).getPlaintext();
        return new String(result.array(), Charset.forName("UTF-8"));
    }
}
